Subtyping and Variance

2024-05-27

最后编辑于:2024-06-09

    #Rust

子类型

在 Rust 中,子类型是针对生命周期存在的。生命周期是代码的作用域,所以我们可以根据它们相互包含的关系判断他们的继承关系。

生命周期的子类型指: 如果'big: 'small,那么'big就是'small的子类型

可以把'static看作是所有生命周期的子类型

https://learnku.com/docs/nomicon/2018/38-subtypes-and-variability/4719 https://doc.rust-lang.org/nomicon/subtyping.html

变性

变性是类型构造函数与它的参数相关的一个属性。Rust中的类型构造函数是一个带有无界参数的通用类型

There are three kinds of variance in Rust. Given two types Sub and Super, where Sub is a subtype of Super:

  • F is covariant if F<Sub> is a subtype of F<Super> (the subtype property is passed through)
  • F is contravariant if F<Super> is a subtype of F<Sub> (the subtype property is "inverted")
  • F is invariant otherwise (no subtyping relationship exists)

协变性(Covariance)

如果类型 T<'a> 是协变的,那么对于生命周期 'a 和 'b,只要 'a: 'b'a 比 'b 长),就有 T<'a>: T<'b>。简单地说,协变意味着可以安全地将生命周期替换为更长的生命周期。

struct Example<'a> { 
	reference: &'a str,
}

这里,Example<'a> 是协变的,因为如果 'a 的生命周期变长,Example<'a> 仍然是有效的。

Contravariant(逆变性)

逆变性与协变性相反。如果类型 T<'a> 是逆变的,那么对于生命周期 'a 和 'b,只要 'a: 'b'a 比 'b 长),就有 T<'b>: T<'a>

Invariant(不变性)

不变性则意味着类型不能因为生命周期的变化而安全地替换。对于某些类型参数,它们既不是协变的,也不是逆变的,称为不变性。

| |'a|T|U| |-|-|-|-| |&'a T|covariant|covariant|| |&'a mut T|covariant|invariant|| |Box<T>||covariant|| |Vec<T>||covariant|| |UnsafeCell<T>||invariant|| |Cell<T>||invariant|| |fn(T) -> U||contravariant|covariant | |*const T||covariant|| |*mut T||invariant||

https://doc.rust-lang.org/nomicon/subtyping.html